#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#define INF 0X7f7f7f7f
#define maxn 100

bool check(int vis[], int n)
{
    int power = pow(2, n);
    int t[power]; //判断该数字是否出现过
    for (int i = 0; i < power; i++)
        t[i] = 0;
    for (int i = 0; i < pow(2, n); i++)
    {
        int sum = 0;
        for (int j = 0; j < n; j++)
        {
            if (vis[(i + j) % power])
            {                     //取余为了环化
                sum += pow(2, j); //将二进制转换为十进制
            }
        }
        if (t[sum])
        { //出现过直接结束
            return false;
        }
        t[sum] = 1;//从小的数开始按+1标记出现，超过一定值后可以用来判断之后出现的数是否重复（因为环化后的数作为记录数组的下标）。
    }
    return true;
}
void dfs(int vis[], int n, int k)
{

    if (k == pow(2, n))
    { //产生了长度为n的二进制序列
        if (check(vis, n))//出现过接收的是false
        {
            for (int i = 0; i < pow(2, n); i++)
            {
                printf("%d ", vis[i]);
            }
            printf("\n");
        }
        return;
    }
    //全排列枚举0/1
    vis[k] = 0;
    dfs(vis, n, k + 1);
    vis[k] = 1;
    dfs(vis, n, k + 1);
}
int main()
{
    int n;
    scanf("%d", &n);
    int power = pow(2, n);
    int vis[power + 1];
    dfs(vis, n, 0);
    return 0;
}